#!/usr/bin/ruby
# C/Migemoの辞書とskkのユーザー辞書からC/Migemo用のユーザー辞書を生成。
# C/Migemoに同梱されてる辞書生成用のperlスクリプトの改造版。

# 第二引数のSKK辞書から単語を抽出し、第一引数のmigemo辞書との重複分を除いてmigemo辞書フォーマットで出力。
# 元のperlスクリプトは送りつきの単語も出力するが、このスクリプトは無視する。
# 辞書は双方EUC-JPとしてUTF-8に変換して処理。
# UIMSKKのユーザー辞書でしかテストしてない。

# コマンドサンプル
# % ./migemo_create_user_dict.rb migemo/euc-jp/migemo-dict ~/.skk-uim-jisyo | nkf -eW - > ~/.migemo-user-dict

require 'nkf'
def create_dict_from_migemo(filename)
  res = {}
  open(filename, 'r') do |file|
    file.each do |line|
      line = NKF.nkf('-wE', line.strip)
      _dummy, key, value = line.match(/^([^\s]+)\t(.*)$/).to_a
      next if key.nil? || value.nil?
      values = value.split(/\t/).delete_if{|v|v.empty?}
      if res.has_key?(key)
        res[key] += values
      else
        res[key] = values
      end
    end
  end
  return res
end
def create_dict_from_skkdic(filename)
  res = {}
  open(filename, 'r') do |file|
    file.each do |line|
      line = NKF.nkf('-wE', line.strip)
      next if line.match(/^;/)
      _dummy, key, value = line.match(/^([^ ]+) +(.*)$/).to_a
      next if key.nil? || value.nil?
      next unless key.match(/(?:^[<>?]|[<>?]$)/).nil?
      next unless key.match(/[a-z]$/).nil?
      have_number = !key.match(/#/).nil?
      value.gsub!(/\[.*?\]\/?/, '')
      value.gsub!(/(?:^\/|\/$)/, '')
      values = value.split('/').delete_if do |v|
        v.empty? || !v.match(/^\([a-zA-Z].*\)$/).nil? || (have_number && !v.match(/\#/).nil?)
      end
      values.map!{|v|v.sub(/;.*$/, '')}
      if res.has_key?(key)
        res[key] += values
      else
        res[key] = values
      end
    end
  end
  return res
end
def uniq(dict1, dict2)
  dict = {}
  dict2.each do |key, values|
    if dict1.has_key?(key)
      dict[key] = values.delete_if{|v|dict1[key].include?(v)}
    else
      dict[key] = values
    end
  end
  return dict.delete_if{|k, v|v.empty?}
end

dict = uniq(create_dict_from_migemo(ARGV[0]),
            create_dict_from_skkdic(ARGV[1]))
dict.keys.sort{|a, b| b.length <=> a.length}.each do |key|
  values = dict[key]
  print "#{key}\t" + values.join("\t") + "\n" unless key.empty? || values.empty?
end
